package com.xlzcx.xltz.service.d_region;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.xlzcx.xltz.dao.DRegionMapper;
import com.xlzcx.xltz.entity.vo.DRegionVo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 作者: 李咨辰
 * 文件名: DRegionServiceImpl.java
 * 路径: com.xlzcx.xltz.service.d_region
 * 时间: 2024-11-20 13:25
 * 版本: 1.0
 * 描述: TODO 行政区划
 **/
@Service
public class DRegionServiceImpl implements DRegionService {
    /**
     * 调用dao层
     */
    @Resource
    private DRegionMapper dRegionMapper;

    /**
     * 根据编号查询
     *
     * @param id        行政区划编号
     * @param hierarchy 查询层级
     * @return 行政区划
     */
    @Override
    public DRegionVo getRegionById(String id, Integer hierarchy) {
        // 获取指定ID的区域
        DRegionVo region = dRegionMapper.getRegionById(id);
        switch (region.getLevel()) {
            case "country"://国家
                if (hierarchy > 4) {
                    hierarchy = 4;
                }
                break;
            case "province"://省份
                if (hierarchy > 3) {
                    hierarchy = 3;
                }
                break;
            case "city"://城市
                if (hierarchy > 2) {
                    hierarchy = 2;
                }
                break;
            case "district"://区县
            case "education"://教育
                if (hierarchy > 1) {
                    hierarchy = 1;
                }
                break;
            default://学校镇
                hierarchy = 0;
                break;
        }

        // 递归加载区域的层级数据
        loadRegionHierarchy(region, hierarchy);
        return region;
    }


    /**
     * 根据父级行政区划编号查询行政区划
     *
     * @param parentId 父级行政区划编号
     * @return 行政区划列表
     */
    @Override
    public List<DRegionVo> getRegionByParentId(Integer parentId) {
        return dRegionMapper.getRegionByParentId(parentId);
    }

    public int getTotalByParentId(Integer parentId) {
        return dRegionMapper.getTotalByParentId(parentId);
    }

    /**
     * 公用查询子级方法
     *
     * @param region    行政区划
     * @param hierarchy 查询级数
     */
    private void loadRegionHierarchy(DRegionVo region, int hierarchy) {
        // 如果层级为0，停止递归
        if (hierarchy <= 0) {
            return;
        }
        // 根据当前区域ID获取子区域
        List<DRegionVo> districts = dRegionMapper.getRegionByParentId(region.getId());
        region.setDistricts(districts);

        // 对每个子区域递归加载下一级区域
        for (DRegionVo district : districts) {
            loadRegionHierarchy(district, hierarchy - 1);
        }
    }

    /**
     * 查询行政区划及所有祖级区划
     *
     * @param id 行政编号
     * @return 行政区划
     */
    @Override
    public DRegionVo getRegionAncestorsById(String id) {
        DRegionVo region = dRegionMapper.getRegionById(id);
        JSONArray ancestorJson = new JSONArray(region.getAncestors());
        List<Integer> ancestorList = JSONUtil.toList(ancestorJson, Integer.class);
        ancestorList.remove(ancestorList.size() - 1);
        DRegionVo ancestorRegion = null;
        for (int ancestorId : ancestorList) {
            if (ancestorRegion == null) {
                ancestorRegion = dRegionMapper.getRegionById(String.valueOf(ancestorId));
            } else {
                ancestorRegion.setOffspring(dRegionMapper.getRegionById(String.valueOf(ancestorId)));
            }
        }
        if (ancestorRegion != null) {
            ancestorRegion.setOffspring(region);
            return ancestorRegion;
        }
        return region;
    }

    /**
     * 根据地理编号判断位置是否存在
     *
     * @param id    行政编号
     * @param level 行政等级，可以为空
     * @return 存在返回true
     */
    @Override
    public boolean isExist(String id, String level) {
        return dRegionMapper.isExist(id, level) > 0;
    }
}
